/*
 * Agente extractor
 * Agente que maneja las operaciones de recepción de información de los documentos y su
 * posterior extraccion de definiciones
 */

package agentes;

import comportamientos.ComportamientoExtraer;
import comportamientos.ComportamientoRecibir;
import graficos.VentanaExtractor;
import jade.core.Agent;
import jade.core.behaviours.DataStore;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.domain.FIPANames;
import jade.lang.acl.MessageTemplate;
import jade.proto.ContractNetResponder;
import java.util.ArrayList;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 *  @author hayner Benavides Moreno y Jorge Hernan Londoño Echeverri
 */
public class AgenteExtractor extends Agent {

    private ArrayList<String> colaDocumentos; // lista con los documentos a extraerle definiciones
    private VentanaExtractor ventana; // interfaz grafica, de acuerdo al aprametro inical se muestra o no
    private DataStore store; //estructura opcional de manejo de información.
 /*   private static Logger log;
    private static FileHandler manejadorArchivo ;*/

    @Override
    public void setup(){

      /*  try{
            manejadorArchivo = new FileHandler("logextractor.log");
            log = Logger.getLogger("agentes.AgenteExtractor");
            log.addHandler(manejadorArchivo);
            log.setLevel(Level.ALL);
        }catch(Exception e){

        }*/

        Object[] argumentos = getArguments();
        if(argumentos.length >0){
            if(((String)argumentos[0]).equals("true")){
                this.ventana = new VentanaExtractor(this);//se inicia la interfaz grafica
                this.ventana.setVisible(true);
            }
        }
        colaDocumentos = new ArrayList<String>();//se inicializa la cola de documentos
        //se definen las propiedades que indican el servicio pretado por el agente
        ServiceDescription servicedesc = new ServiceDescription();
        servicedesc.setType("extractor");
        servicedesc.setName("agente");

        DFAgentDescription dfad = new DFAgentDescription();
        dfad.setName(getAID());
        dfad.addLanguages("castellano");
        dfad.addServices(servicedesc);

        try{
            DFService.register(this, dfad);//se registra el agente en la paltaforma
            setSucesoVentana("registrado en la plataforma",Level.FINE);//primer mensaje para el log
        }catch(FIPAException fe){
            setSucesoVentana("error al registrar el servicio",Level.SEVERE);
        }
        //creacion de la plantilla de mensaje que define cuales mensajes e reciben y procesan y cuales no
        MessageTemplate mt = ContractNetResponder.createMessageTemplate(FIPANames.InteractionProtocol.FIPA_CONTRACT_NET);
        ComportamientoRecibir cr = new ComportamientoRecibir(this, mt, store);
        addBehaviour(cr);
        //comportmaiento que extrae las definiciones
        ComportamientoExtraer ce = new ComportamientoExtraer(this,4000,store);
        addBehaviour(ce);
        
    }

    public ArrayList<String> getDocumentos() {
        return colaDocumentos;
    }

    public void setDocumentos(ArrayList<String> documentos) {
        this.colaDocumentos.addAll(documentos); 
    }

    public void setDocumento(String documento){
        this.colaDocumentos.add(documento);
    }

    public void removerDocumento(String documento){
        this.colaDocumentos.remove(documento);
    }

    public int contarDocumentos(){
        return this.colaDocumentos.size();
    }

    public void setSucesoVentana(String suceso,Level nivel) {
        if(ventana!=null){
            ventana.adicionarSuceso(suceso);//se coloca en la interfaz grafica el texto que describe el suceso
            

            
        }
    }

    


}
